Jak zrychlit cteni IBOQuery
Otázka od: Andreas Bednarek
22. 7. 2004 11:44
Ahoj vsem,
s pouzitim IBObjects, FB1.5RC8 a Delphi 4 vytvorim SQL dotaz nad databazi.
Vysledne radky prochazim a kopiruji (a interne upravuji hodnoty) do
vlastnich struktur v pameti a nasledne zobrazuji v ListView ve virtualnim
modu. Pouzivam pri tom metody FieldByName, nebot jsem neobjevil jak nacist
cely radek najednou napr do pole typu variant pokud by to slo.
Nevim kde FB uklada vysledek dotazu, ale pri tomto postupu mi kazdopadne
hrka HD a zobrazeni napr. 30000 polozek trva asi 20vterin, casto je potreba
vice. Samotne vykonani dotazu (cili vykonani Query.Open) je podstatne kratsi
. Rad bych zrychlil nacitani do pameti.
Nemuzete mi poradit jak by to slo udelat, pripadne jak to funguje a zda je
vysledek SQL dotazu ulozen v pameti (je ji snad dost), jak bych asi
ocekaval?
Dekuji
Andreas D4
Odpovedá: petr palicka
22. 7. 2004 11:26
misto FieldByName pouzij Field[n].
je to radove rychlejsi. pokud neznas dopredu poradi poli, lze si je
dohledat treba tkhle:
var
fID, fJmeno: TField;
id: Integer;
jmeno: String;
begin
fID:=IBQuery1.FindField('ID');
fJmeno:=IBQuery1.FindField('Jmeno');
if (fID<>nil)and(fJmeno<>nil) then
begin
id:=fID.AsInteger;
jmeno:=fJmeno.AsString;
...
end;
...
end;
peca
Odpovedá: Andreas Bednarek
22. 7. 2004 11:31
> misto FieldByName pouzij Field[n].
> je to radove rychlejsi. pokud neznas dopredu poradi poli, lze si je
> dohledat treba tkhle:
>
etc.
Diky, poradi sice teoreticky znam, ale muze se zmenit, proto jsem vzdycky
radeji pouzival FieldByName nez FieldByNumber, necekal jsem, ze bych poznal
extra rozdil v rychlosti a lepe se upgraduje se zmenou DB.
Zkusim tedy Fields[n], mimochodem udajne existuje jeste metoda Row, nevis
neco blizsiho?
A dekuji (pripadne predem)
Andreas
Odpovedá: Daniel Frantik
22. 7. 2004 11:50
Ahoj,
overil bych si jak dlouho bude trvat (otevreni a nacteni) :
Query.Open;
Query.Last;
Jeste pokud mas fieldy vygenerovane v designtime tak jsem pristupovat
primo na ty objekty: QueryName.Value atd...
Taky by pomohlo nastavit Query.Unidirectional:=True;
Danik
BTW 30000 vet v pameti je celkem dost ...
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
> Nevim kde FB uklada vysledek dotazu, ale pri tomto postupu mi
> kazdopadne hrka HD a zobrazeni napr. 30000 polozek trva asi
> 20vterin, casto je potreba vice. Samotne vykonani dotazu
> (cili vykonani Query.Open) je podstatne kratsi . Rad bych
> zrychlil nacitani do pameti.
Odpovedá: Marek
22. 7. 2004 12:35
ahoj,
a co filter ?
proc nacitat 30000 polozek ?
co zkusit misto Listview - VirtualTreeView
Marek
Ahoj vsem,
s pouzitim IBObjects, FB1.5RC8 a Delphi 4 vytvorim SQL dotaz nad databazi.
Vysledne radky prochazim a kopiruji (a interne upravuji hodnoty) do
vlastnich struktur v pameti a nasledne zobrazuji v ListView ve virtualnim
modu. Pouzivam pri tom metody FieldByName, nebot jsem neobjevil jak nacist
cely radek najednou napr do pole typu variant pokud by to slo.
Nevim kde FB uklada vysledek dotazu, ale pri tomto postupu mi kazdopadne
hrka HD a zobrazeni napr. 30000 polozek trva asi 20vterin, casto je potreba
vice. Samotne vykonani dotazu (cili vykonani Query.Open) je podstatne kratsi
. Rad bych zrychlil nacitani do pameti.
Nemuzete mi poradit jak by to slo udelat, pripadne jak to funguje a zda je
vysledek SQL dotazu ulozen v pameti (je ji snad dost), jak bych asi
ocekaval?
Dekuji
Andreas D4
Odpovedá: Andreas Bednarek
23. 7. 2004 11:45
> ahoj,
>
> a co filter ?
> proc nacitat 30000 polozek ?
> co zkusit misto Listview - VirtualTreeView
>
Protoze uzivatel si pocvaka co chce videt, ale nevi kolik toho bude. Stane
se klidne, ze mu to vyhodi 100000 zaznamu, tedy do te doby, nez se nauci
pouzivat filtry, ktere ma k dispozici. Ale treba 10-15000 zaznamu jeste neni
tak moc pokud se pak hleda v razenem seznamu, a proste se tolik nekdy
zobrazi a ja to chci urychlit, protoze rychlost mam rad
VirtualTreeView je bezva a ma skvele featury, ale me tady staci LV ve
virtualnim rezimu, navic s VTV jsem mozna delal nejakou chybu, ale mel-li
jsem napr tech 100000 root nodu a 6 sloupcu (tabulka), tak VTV byl opravdu
"lightning fast" jak se pise na webu, ale jen do te doby, nez jsem
nescrolloval moc dolu. Cim niz tim pomaleji to jelo, uplne dole to bylo
proste nesnesitelne. Inicializace nodu byla proste pomala.
A.
Odpovedá: Andreas Bednarek
23. 7. 2004 12:13
> > misto FieldByName pouzij Field[n].
> > je to radove rychlejsi. pokud neznas dopredu poradi poli, lze si je
> > dohledat treba tkhle:
> >
> etc.
>
No mam to ted tak udelane, je to o neco rychlejsi, radove sice ne, ale co
uz, nejaky prinos to byl.
>Taky by pomohlo nastavit Query.Unidirectional:=True;
Tam je rychlost stejna, nepozoroval jsem nejaky rozdil.
Dekuji vsem za rady a namety
Odpovedá: Daniel Frantik
23. 7. 2004 12:50
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
>
> >Taky by pomohlo nastavit Query.Unidirectional:=True;
> Tam je rychlost stejna, nepozoroval jsem nejaky rozdil.
Bude to podobne rychle jen do te doby, nez zacne swapovat na disk ...
30000 * 1024 = cca 30MB a pokud se toto musi udrzovat v pameti ... (pri
vetsi sirce vety (nebo na app serveru s vice klienty) by to bylo
vyraznejsi...
Danik
PS: co omezit maximalni nactene mnozstvi uz selectem a dat uzivateli
vedet, ze nema vsechno, at si poupravi filtr ... ?
Odpovedá: Andreas Bednarek
23. 7. 2004 15:06
> > >Taky by pomohlo nastavit Query.Unidirectional:=True;
> > Tam je rychlost stejna, nepozoroval jsem nejaky rozdil.
>
> Bude to podobne rychle jen do te doby, nez zacne swapovat na disk ...
Tak to jo to tam tedy nastavim - potrebuji jen IBOQuery.Next.
> PS: co omezit maximalni nactene mnozstvi uz selectem a dat uzivateli
> vedet, ze nema vsechno, at si poupravi filtr ... ?
To by slo, ale uzivatel tam nastesti ma tlacitko 'storno'. Osobne si myslim,
ze je to o neco lepsi, nez upozornovaci dialog, uzivatel sam vidi co se deje
a pomuze si jestli se mu neco nezda (nemusi studovat podivnou neznamou
hlasku , take tezko rict na kolik to omezit. Ale to uz jsou drobnosti.
A.